<?php

class PerfilController extends Zend_Controller_Action
{
    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //--------------------------------//
    //             PAGINA             //
    //--------------------------------//

    public function crearAction()
    {
        if (X\CheckAccess::PageAction('Perfil.crear')) return;

        try{
            // obtener los datos
            $funcionalidades = $this->em->createQueryBuilder()
                    ->select         ('f.codigoFuncionalidad')
                    ->addselect      ('f.nombreFuncionalidad')
                    ->from           ('Default_Model_Funcionalidades', 'f')
                    ->orderBy        ('f.nombreFuncionalidad', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // convertir a json
            $this->view->jsonFuncionalidades = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($funcionalidades),
                "rows"    => $funcionalidades
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar las funcionalidades.';
        }
    }

    public function editarAction()
    {
        if (X\CheckAccess::PageAction('Perfil.editar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getQuery('id');

            // obtener los datos
            $this->view->perfil = $this->em->find('Default_Model_PerfilPrivilegios', $id);

            $funcionalidades = $this->em->createQueryBuilder()
                    ->select         ('f.codigoFuncionalidad')
                    ->addselect      ('f.nombreFuncionalidad')
                    ->from           ('Default_Model_Funcionalidades', 'f')
                    ->orderBy        ('f.nombreFuncionalidad', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            $funcionalidadesPerfil = $this->em->createQueryBuilder()
                    ->select         ('f.codigoFuncionalidad')
                    ->addselect      ('f.nombreFuncionalidad')
                    ->from           ('Default_Model_Funcionalidades', 'f')
                    ->join           ('f.perfiles',                    'p')
                    ->where          ("p.codigoPerfil=$id")
                    ->orderBy        ('f.nombreFuncionalidad', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // convertir a json
            $this->view->jsonFuncionalidades = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($funcionalidades),
                "rows"    => $funcionalidades
            ));

            $this->view->jsonFuncionalidadesPerfil = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($funcionalidadesPerfil),
                "rows"    => $funcionalidadesPerfil
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar el perfil.';
        }
    }

    public function listarAction()
    {
      //  if (X\CheckAccess::PageAction('Perfil.listar')) return;

        try{
            // obtener los datos
            $perfiles = $this->em->createQueryBuilder()
                    ->select         ('p.codigoPerfil')
                    ->addselect      ('p.nombrePerfil')
                    ->from           ('Default_Model_PerfilPrivilegios', 'p')
                    ->orderBy        ('p.nombrePerfil', 'asc')
                    ->setFirstResult (0)
                    ->setMaxResults  (20)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(p.codigoPerfil)')
                    ->from     ('Default_Model_PerfilPrivilegios', 'p')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // convertir a json
            $this->view->jsondata = Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $perfiles
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los perfiles.';
        }
    }

    //--------------------------------//
    //              AJAX              //
    //--------------------------------//

    public function ajaxCrearAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Perfil.crear')) return;

        try{
            // obtener los parametros
            $nombrePerfil = $this->_request->getPost('nombrePerfil');
            $editorRows   = $this->_request->getPost('editorRows');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                ->select   ('count(p.codigoPerfil)')
                ->from     ('Default_Model_PerfilPrivilegios', 'p')
                ->where    ("p.nombrePerfil='".pg_escape_string($nombrePerfil)."'")
                ->getQuery ()
                ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('Ya existe un perfil con este nombre.');
                return;
            }

            // crear
            $perfil = new Default_Model_PerfilPrivilegios;
            $perfil->setNombrePerfil($nombrePerfil);

            //obtener los datos
            $rows = Zend_Json::decode($editorRows);

            // crear funcionalidades
            foreach($rows as $row){
                $funcionalidad = $this->em->find('Default_Model_Funcionalidades', $row['codigoFuncionalidad']);
                $funcionalidad->addPerfil($perfil);

                $perfil->addFuncionalidad($funcionalidad);
            }

            // guardar
            $this->em->persist($perfil);
            $this->em->flush();

            X\Msg::Success('El perfil se ha creado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear el perfil.');
        }
    }

    public function ajaxEditarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Perfil.editar')) return;

        try{
            // obtener los parametros
            $codigoPerfil = $this->_request->getPost('codigoPerfil');
            $nombrePerfil = $this->_request->getPost('nombrePerfil');
            $editorRows   = $this->_request->getPost('editorRows');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(p.codigoPerfil)')
                    ->from     ('Default_Model_PerfilPrivilegios', 'p')
                    ->where    ("p.nombrePerfil='".pg_escape_string($nombrePerfil)."'")
                    ->andWhere ("p.codigoPerfil<>'$codigoPerfil'")
                    ->getQuery ()
                    ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('Ya existe un perfil con este nombre.');
                return;
            }

            // obtener y modificar el objeto

                // perfil
                $perfil = $this->em->find('Default_Model_PerfilPrivilegios', $codigoPerfil);
                $perfil->setNombrePerfil($nombrePerfil);

                //funcionalidades
                $rows = Zend_Json::decode($editorRows);

                // eliminar perfiles viejos
                foreach($perfil->getFuncionalidades() as $funcionalidad){
                    $funcionalidad->getPerfiles()->removeElement($perfil);
                    $perfil->getFuncionalidades()->removeElement($funcionalidad);
                }

                // crear perfiles nuevos
                foreach($rows as $row){
                    $funcionalidad = $this->em->find('Default_Model_Funcionalidades', $row['codigoFuncionalidad']);
                    $funcionalidad->addPerfil($perfil);
                    
                    $perfil->addFuncionalidad($funcionalidad);
                }

            // guardar el objeto
            $this->em->persist($perfil);
            $this->em->flush();

            X\Msg::Success('El perfil se ha guardado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al guardar el perfil.');
        }
    }
    
    public function ajaxEliminarAction()
    {
        //if (X\CheckAccess::AjaxAction($this, 'Perfil.eliminar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getPost('id');

            // verificar
            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(u.codigoUsuario)')
                    ->from     ('Default_Model_Usuario', 'u')
                    ->join     ('u.perfil',              'p')
                    ->where    ("p.codigoPerfil='$id'")
                    ->getQuery ()
                    ->getSingleScalarResult();

            if ($cantidad > 0){
                X\Msg::Failure('El perfil seleccionado está en uso.');
                return;
            }

            // obtener el objeto
            $perfil = $this->em->find('Default_Model_PerfilPrivilegios', $id);

            // guardar el objeto
            $this->em->remove($perfil);
            $this->em->flush();

            X\Msg::Success('El perfil se ha eliminado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al eliminar el perfil.');
        }
    }

    public function ajaxListarAction()
    {
       // if (X\CheckAccess::AjaxAction($this, 'Perfil.listar')) return;

        try{
            // obtener los parametros
            $start = $this->_request->getPost("start");
            $limit = $this->_request->getPost("limit");
            $sort  = $this->_request->getPost("sort");
            $dir   = $this->_request->getPost("dir");

            // parametros por defecto
            $sort = isset($sort)? $sort : 'nombrePerfil';
            $dir  = isset($dir)?  $dir  : 'asc';

            // obtener los datos
            $perfiles = $this->em->createQueryBuilder()
                    ->select         ('p.codigoPerfil')
                    ->addselect      ('p.nombrePerfil')
                    ->from           ('Default_Model_PerfilPrivilegios', 'p')
                    ->orderBy        ("p.$sort", $dir)
                    ->setFirstResult ($start)
                    ->setMaxResults  ($limit)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(p.codigoPerfil)')
                    ->from     ('Default_Model_PerfilPrivilegios', 'p')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $perfiles
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los perfiles.');
        }
    }
}
